/*********************************************************************
*
*      Copyright (C) 2002 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/

package org.nokatag.jxl.write;

import org.nokatag.jxl.format.Colour;
import org.nokatag.jxl.format.Font;
import org.nokatag.jxl.format.ScriptStyle;
import org.nokatag.jxl.format.UnderlineStyle;
import org.nokatag.jxl.write.biff.WritableFontRecord;

/**
 * A class which is instantiated when the user application wishes to specify
 * the font for a particular cell
 */
public class WritableFont extends WritableFontRecord
{
  /**
   * Static inner class used for classifying the font names
   */
  public static class FontName
  {
    /**
     * The name
     */
    String name;

    /**
     * Constructor
     *
     * @param s the font name
     */
    FontName(String s)
    {
      name = s;
    }
  }

  /**
   * Static inner class used for the boldness of the fonts
   */
  /*private*/ static class BoldStyle
  {
    /**
     * The value
     */
    public int value;

    /**
     * Constructor
     *
     * @param val the value
     */
    BoldStyle(int val)
    {
      value = val;
    }
  }

  /**
   * Objects created with this font name will be rendered within Excel as ARIAL
   * fonts
   */
  public static final FontName ARIAL = new FontName("Arial");
  /**
   * Objects created with this font name will be rendered within Excel as TIMES
   * fonts
   */
  public static final FontName TIMES = new FontName("Times New Roman");
  /**
   * Objects created with this font name will be rendered within Excel as
   * COURIER fonts
   */
  public static final FontName COURIER = new FontName("Courier New");
  /**
   * Objects created with this font name will be rendered within Excel as
   * TAHOMA fonts
   */
  public static final FontName TAHOMA = new FontName("Tahoma");

  // The bold styles

  /**
   * Indicates that this font should not be presented as bold
   */
  public static final BoldStyle NO_BOLD  = new BoldStyle(0x190);
  /**
   * Indicates that this font should be presented in a BOLD style
   */
  public static final BoldStyle BOLD     = new BoldStyle(0x2bc);

  /**
   * The default point size for all Fonts
   */
  public static final int DEFAULT_POINT_SIZE = 10;

  /**
   * Creates a default font, vanilla font of the specified face and with
   * default point size.
   *
   * @param fn the font name
   */
  public WritableFont(FontName fn)
  {
    this(fn,
         DEFAULT_POINT_SIZE,
         NO_BOLD,
         false,
         UnderlineStyle.NO_UNDERLINE,
         Colour.BLACK,
         ScriptStyle.NORMAL_SCRIPT);
  }

  /**
   * Publicly available copy constructor
   *
   * @param f the font to copy
   */
  public WritableFont(Font f)
  {
    super(f);
  }

  /**
   * Constructs of font of the specified face and of size given by the
   * specified point size
   *
   * @param ps the point size
   * @param fn the font name
   */
  public WritableFont(FontName fn, int ps)
  {
    this(fn, ps, NO_BOLD, false,
         UnderlineStyle.NO_UNDERLINE,
         Colour.BLACK,
         ScriptStyle.NORMAL_SCRIPT);
  }

  /**
   * Creates a font of the specified face, point size and bold style
   *
   * @param ps the point size
   * @param bs the bold style
   * @param fn the font name
   */
  public WritableFont(FontName fn, int ps, BoldStyle bs)
  {
    this(fn, ps, bs, false,
         UnderlineStyle.NO_UNDERLINE,
         Colour.BLACK,
         ScriptStyle.NORMAL_SCRIPT);
  }

  /**
   * Creates a font of the specified face, point size, bold weight and
   * italicised option.
   *
   * @param ps the point size
   * @param bs the bold style
   * @param italic italic flag
   * @param fn the font name
   */
  public WritableFont(FontName fn, int ps, BoldStyle bs, boolean italic)
  {
    this(fn, ps, bs, italic,
         UnderlineStyle.NO_UNDERLINE,
         Colour.BLACK,
         ScriptStyle.NORMAL_SCRIPT);
  }

  /**
   * Creates a font of the specified face, point size, bold weight,
   * italicisation and underline style
   *
   * @param ps the point size
   * @param bs the bold style
   * @param us the underline style
   * @param fn the font name
   * @param it italic flag
   */
  public WritableFont(FontName fn,
                      int ps,
                      BoldStyle bs,
                      boolean it,
                      UnderlineStyle us)
  {
    this(fn, ps, bs, it, us, Colour.BLACK, ScriptStyle.NORMAL_SCRIPT);
  }


  /**
   * Creates a font of the specified face, point size, bold style,
   * italicisation, underline style and colour
   *
   * @param ps the point size
   * @param bs the bold style
   * @param us the underline style
   * @param fn the font name
   * @param it italic flag
   * @param c the colour
   */
  public WritableFont(FontName fn,
                      int ps,
                      BoldStyle bs,
                      boolean it,
                      UnderlineStyle us,
                      Colour c)
  {
    this(fn, ps, bs, it, us, c, ScriptStyle.NORMAL_SCRIPT);
  }


  /**
   * Creates a font of the specified face, point size, bold style,
   * italicisation, underline style, colour, and script
   * style (superscript/subscript)
   *
   * @param ps the point size
   * @param bs the bold style
   * @param us the underline style
   * @param fn the font name
   * @param it the italic flag
   * @param c the colour
   * @param ss the script style
   */
  public WritableFont(FontName fn,
                      int ps,
                      BoldStyle bs,
                      boolean it,
                      UnderlineStyle us,
                      Colour c,
                      ScriptStyle ss)
  {
    super(fn.name, ps, bs.value, it,
          us.getValue(),
          c.getValue(), ss.getValue());
  }

  /**
   * Sets the point size for this font, if the font hasn't been initialized
   *
   * @param pointSize the point size
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setPointSize(int pointSize) throws WriteException
  {
    super.setPointSize(pointSize);
  }

  /**
   * Sets the bold style for this font, if the font hasn't been initialized
   *
   * @param boldStyle the bold style
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setBoldStyle(BoldStyle boldStyle) throws WriteException
  {
    super.setBoldStyle(boldStyle.value);
  }

  /**
   * Sets the italic indicator for this font, if the font hasn't been
   * initialized
   *
   * @param italic the italic flag
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setItalic(boolean italic) throws WriteException
  {
    super.setItalic(italic);
  }

  /**
   * Sets the underline style for this font, if the font hasn't been
   * initialized
   *
   * @param us the underline style
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setUnderlineStyle(UnderlineStyle us) throws WriteException
  {
    super.setUnderlineStyle(us.getValue());
  }

  /**
   * Sets the colour for this font, if the font hasn't been
   * initialized
   *
   * @param colour the colour
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setColour(Colour colour) throws WriteException
  {
    super.setColour(colour.getValue());
  }

  /**
   * Sets the script style (eg. superscript, subscript) for this font,
   * if the font hasn't been initialized
   *
   * @param scriptStyle the colour
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setScriptStyle(ScriptStyle scriptStyle) throws WriteException
  {
    super.setScriptStyle(scriptStyle.getValue());
  }

  /**
   * Accessor for the strike-out flag
   *
   * @return the strike-out flag
   */
  public boolean isStruckout()
  {
    return super.isStruckout();
  }

  /**
   * Sets Accessor for the strike-out flag
   *
   * @param struckout TRUE if this is a struckout font
   * @return the strike-out flag
   * @exception WriteException, if this font is already in use elsewhere
   */
  public void setStruckout(boolean struckout) throws WriteException
  {
    super.setStruckout(struckout);
  }

  /**
   * Factory method which creates the specified font name.  This method
   * should be used with care, since the string used to create the font
   * name must be recognized by Excel's internal processing
   *
   * @param fontName the name of the Excel font
   * @return the font name
   */
  public static FontName createFont(String fontName)
  {
    return new FontName(fontName);
  }
}

